package com.ceair.utils;

import com.ceair.entity.ProcessDefinition;
import com.ceair.entity.vo.ProcessDefinitionVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

/**
 * @author wangbaohai
 * @ClassName ProcessDefinitionStructMapper
 * @description: 流程定义结构映射器
 * 提供 ProcessDefinition 和 ProcessDefinitionVO 之间的双向映射功能。
 * 注意事项：
 * 1. 输入参数不允许为 null，否则会抛出 IllegalArgumentException。
 * 2. 如果字段包含复杂对象（如集合或嵌套对象），请确保映射规则已正确定义。
 * @date 2025年04月12日
 * @version: 1.0.0
 */
@Mapper
public interface ProcessDefinitionStructMapper {

    ProcessDefinitionStructMapper INSTANCE = Mappers.getMapper(ProcessDefinitionStructMapper.class);

    /**
     * 将 ProcessDefinition 转换为 ProcessDefinitionVO。
     *
     * @param processDefinition 输入的 ProcessDefinition 对象，不能为空。
     * @return 转换后的 ProcessDefinitionVO 对象。
     * @throws IllegalArgumentException 如果输入参数为 null。
     */
    default ProcessDefinitionVO toVO(ProcessDefinition processDefinition) {
        if (processDefinition == null) {
            throw new IllegalArgumentException("Input parameter 'processDefinition' cannot be null.");
        }
        return mapToVO(processDefinition);
    }

    /**
     * 映射逻辑的具体实现。
     *
     * @param processDefinition 输入的 ProcessDefinition 对象。
     * @return 转换后的 ProcessDefinitionVO 对象。
     */
//    @Mapping(target = "complexField", source = "complexField") // 示例：显式定义复杂字段映射规则
    ProcessDefinitionVO mapToVO(ProcessDefinition processDefinition);

    /**
     * 将 ProcessDefinitionVO 转换为 ProcessDefinition。
     *
     * @param processDefinitionVO 输入的 ProcessDefinitionVO 对象，不能为空。
     * @return 转换后的 ProcessDefinition 对象。
     * @throws IllegalArgumentException 如果输入参数为 null。
     */
    default ProcessDefinition toEntity(ProcessDefinitionVO processDefinitionVO) {
        if (processDefinitionVO == null) {
            throw new IllegalArgumentException("Input parameter 'processDefinitionVO' cannot be null.");
        }
        return mapToEntity(processDefinitionVO);
    }

    /**
     * 映射逻辑的具体实现。
     *
     * @param processDefinitionVO 输入的 ProcessDefinitionVO 对象。
     * @return 转换后的 ProcessDefinition 对象。
     */
//    @Mapping(target = "complexField", source = "complexField") // 示例：显式定义复杂字段映射规则
    ProcessDefinition mapToEntity(ProcessDefinitionVO processDefinitionVO);
}
